package cn.thinkluck.pattern.state.mario.table;

import cn.thinkluck.pattern.state.mario.Event;
import cn.thinkluck.pattern.state.mario.MarioState;
import lombok.Getter;

/**
 * 马里奥
 * 查表法马里奥状态
 *
 * @Author liutao
 * @DateTime 2024/8/3 下午4:42
 */
@Getter
public class Mario {
    /**
     * 马里奥状态
     */
    private MarioState state;
    /**
     * 使用二维数组定义状态转换表
     * 第一维表示事件，第二维表示马里奥状态，数据表示结果
     */
    private static final MarioState[][] TRANSITION_TABLE = {
            // 0：小马里奥，      1：大马里奥，         2：火焰马里奥，   3：死亡马里奥
            {MarioState.BIG, MarioState.BIG, MarioState.FIRE, MarioState.DEAD}, // 0.吃蘑菇
            {MarioState.SMALL, MarioState.FIRE, MarioState.FIRE, MarioState.DEAD}, // 1.吃火花
            {MarioState.DEAD, MarioState.SMALL, MarioState.SMALL, MarioState.DEAD}, // 2.被攻击
            {MarioState.DEAD, MarioState.DEAD, MarioState.DEAD, MarioState.DEAD} // 3.掉坑里
    };


    /**
     * 初始化小马里奥
     */
    public Mario() {
        this.state = MarioState.SMALL;
    }

    /**
     * 触发事件
     * 分支预测法
     *
     * @param event 事件
     */
    public void handleEvent(Event event) {
        /*
            枚举中根据表，已经维护好了顺序，那么就可以直接通过枚举中的下标获取结果
            event.ordinal() 获取事件的下标
            this.state.ordinal() 获取当前状态的下标
            TRANSITION_TABLE 维护的结果表
         */
        this.state = TRANSITION_TABLE[event.ordinal()][this.state.ordinal()];
    }
}
